#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>

using namespace std;

//输出未决位图
void Print(sigset_t &pending)
{
    std::cout << "curr process pending: ";
    for(int sig = 31; sig >= 1; sig--)
    {
        if(sigismember(&pending, sig)) 
        {
            cout << "1";
        }
        else 
        {
            cout << "0";
        }
    }
    cout << endl;
}

void handler(int signo)
{
    cout << "signal : " << signo << endl;
    //不断获取当前进程的pending信号集合并打印
    sigset_t pending;
    sigemptyset(&pending);
    while(true)
    {
        sigpending(&pending);
        Print(pending);
        sleep(1);
    }
}

int main()
{
    struct sigaction act, oact;
    //如同signal(信号编号, handler);
    act.sa_handler = handler;
    act.sa_flags = 0;
    sigemptyset(&act.sa_mask); 
    //这里屏蔽信号集合3，4，5
    sigaddset(&act.sa_mask, 3);
    sigaddset(&act.sa_mask, 4);
    sigaddset(&act.sa_mask, 5);
    sigaction(2, &act, &oact);
    //防止进程退出
    while (true) sleep(1);
    return 0;
}
